package muhnes.sizoo.consulta;

import java.io.Serializable;
import java.util.Collections;
import java.util.EnumMap;
import java.util.Map;

public class Ordenador implements Serializable, IConsultable, Comparable<Ordenador> {
    
     static {
        Map<TipoOrdenacion,String> temp = new EnumMap<TipoOrdenacion,String>(TipoOrdenacion.class);
        temp.put(TipoOrdenacion.ASCENDENTE, "%s ASC");
        temp.put(TipoOrdenacion.DESCENDENTE, "%s DESC");
        mapeoOrdenaciones = Collections.unmodifiableMap(temp);
    }
    
    private final static Map<TipoOrdenacion,String> mapeoOrdenaciones; 
    
    private Campo campo;
    private TipoOrdenacion ordenacion;

    public Ordenador() {
    }

    public Ordenador(Campo campo, TipoOrdenacion ordenacion) {
        this.campo = campo;
        this.ordenacion = ordenacion;
    }

    public Campo getCampo() {
        return campo;
    }

    public void setCampo(Campo campo) {
        this.campo = campo;
    }

    public TipoOrdenacion getOrdenacion() {
        return ordenacion;
    }

    public void setOrdenacion(TipoOrdenacion ordenacion) {
        this.ordenacion = ordenacion;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Ordenador other = (Ordenador) obj;
        if (this.campo != other.campo && (this.campo == null || !this.campo.equals(other.campo))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 89 * hash + (this.campo != null ? this.campo.hashCode() : 0);
        return hash;
    }

    @Override
    public String getValorConsultable() {
        String patronOrdenacion = mapeoOrdenaciones.get(ordenacion);
        String consultable = String.format(
            patronOrdenacion, 
            campo.getFuente().getValor() + "." + campo.getValor()
        );
        return consultable;
    }

    @Override
    public int compareTo(Ordenador ordenador) {
        return campo.getNombre().compareTo(ordenador.getCampo().getNombre());
    }
    
}
